home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / WINSOCK.PAK / DLGSRVC.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  134 lines

  1. /*-----------------------------------------------------------------------*\
  2. | OWLSock Demo For Windows v1.0                                           |
  3. --------------------------------------------------------------------------|
  4. | Written By:  Paul Pedriana                                              |
  5. | Date:        May 7, 1995.                                               |
  6. | Copyright:   Copyright (c) 1995 by Paul Pedriana.  All Rights Reserved. |
  7. | UserID(s):   70541,3223                                                 |
  8. |              70541.3223@compuserve.com                                  |
  9. --------------------------------------------------------------------------|
  10. | This OWLSock demo is an application that demonstrates some features     |
  11. | of OWLSock.  It uses only asynchronous (non-blocking) Winsock calls,    |
  12. | and uses OWLSock socket 'external' notification rather than internal    |
  13. | notification.  External notification is the way most Winsock apps do    |
  14. | FD_XXX notifications; see the OWLSock docs for more info.               |
  15. --------------------------------------------------------------------------|
  16. | Notes on this module:                                                   |
  17. |    This module is a dialog box that implements the service (servent)    |
  18. | getXbyY functions.  It simply accepts a service and protocol and tells  |
  19. | you what port they reside on, if any.  Although Winsock is supposed to  |
  20. | let you specify a NULL protocol parameter, some of the current Winsock  |
  21. | implementations don't seem to allow this.                               |                                                         |
  22. \*-----------------------------------------------------------------------*/
  23.  
  24. #include <owl/pch.h>
  25. #if !defined(OWL_DIALOG_H)
  26. # include <owl/dialog.h>
  27. #endif
  28. #if !defined(OWL_WINSOCK_H)
  29. # include <owl/winsock.h>
  30. #endif
  31. #include "dlgsrvc.h"
  32.  
  33. //********************************************************************************************
  34. DEFINE_RESPONSE_TABLE1(DlgConvertService, TDialog)
  35.   EV_CHILD_NOTIFY(IDC_BTN_CONVERT, BN_CLICKED, CmBtnConvert),
  36.   EV_MESSAGE(MSG_SERVICE_NOTIFY, DoNotification),
  37. END_RESPONSE_TABLE;
  38.  
  39. DlgConvertService::DlgConvertService(TWindow* parent, TResId resId, TModule* module)
  40. :
  41.   TDialog(parent, resId, module),
  42.   myPresentState(nIdle)
  43. {
  44.   editService  = new TEdit  (this, IDC_EDIT_SERVICE,  255);
  45.   editProtocol = new TEdit  (this, IDC_EDIT_PROTOCOL,  20);
  46.   editPort     = new TEdit  (this, IDC_EDIT_PORT,      20);
  47.   staticStatus = new TStatic(this, IDC_STATIC_STATUS, 32);
  48.   btnConvert   = new TButton(this, IDC_BTN_CONVERT);
  49. }
  50.  
  51.  
  52.  
  53. void DlgConvertService::SetupWindow()
  54. {
  55.   TDialog::SetupWindow();
  56. }
  57.  
  58.  
  59. TResult DlgConvertService::DoNotification(WPARAM, LPARAM lParam)
  60. {
  61.   char szPortOutput[256];
  62.   int  nError = (int)WSAGETASYNCERROR(lParam);
  63.  
  64.   ::MessageBeep(10);
  65.   if (nError) {
  66.     MessageBox(TSocketError(nError).AppendError("Error looking up service."), "Error", MB_OK);
  67.   }
  68.   else {
  69.     wsprintf(szPortOutput, "%d", TWinSock::Dll()->ntohs(myServiceManager.ServiceEntry->s_port));
  70.     editPort->SetWindowText(szPortOutput);
  71.     editProtocol->SetWindowText(myServiceManager.ServiceEntry->s_proto);
  72.   }
  73.   GoToIdleState();
  74.   return 1;
  75. }
  76.  
  77. void DlgConvertService::CmBtnConvert()
  78. {
  79.   char  szServiceInput[32];
  80.   char  szProtocolInput[32];
  81.   char*  szProtocolInputPtr;
  82.   int   nError;
  83.   HANDLE hServiceRequest;
  84.  
  85.   if (myPresentState == nWaitingForService) {
  86.     myServiceManager.CancelServiceRequest(); //Cancels the most recent request.
  87.     GoToIdleState();
  88.     return;
  89.   }
  90.   GoToWaitingForServiceState();
  91.   editPort->Clear(); //Clear the text.
  92.   editService->GetWindowText(szServiceInput, 32);
  93.   editProtocol->GetWindowText(szProtocolInput, 32);
  94.   btnConvert->SetWindowText("Cancel");
  95.  
  96.   // The follwing code isn't common in real-life applications.  Usually, the
  97.   //  application knows what service and protocol it is looking for, and so
  98.   //  doesn't have to do this Null-testing logic:
  99.   //
  100.   if (szProtocolInput[0])
  101.     szProtocolInputPtr = szProtocolInput;
  102.   else
  103.     szProtocolInputPtr = 0; //Need to do this to allow user to let Winsock find ANY port for the service.
  104.  
  105.   nError = myServiceManager.GetServiceAsync(*this, hServiceRequest, szServiceInput, szProtocolInputPtr);
  106.   if (nError == WINSOCK_ERROR) {
  107.     MessageBox(TSocketError(myServiceManager.GetLastError()).GetReasonString(), "Error", MB_OK);
  108.     GoToIdleState();
  109.   }
  110. }
  111.  
  112.  
  113. void DlgConvertService::CmOk()
  114. {
  115.   if (myPresentState != nIdle) {
  116.     CmBtnConvert();  //Causes a cancellation of service request.
  117.   }
  118.   TDialog::CmOk(); //We are done and can close this dialog.
  119. }
  120.  
  121. void DlgConvertService::GoToIdleState()
  122. {
  123.   btnConvert->SetWindowText("--> Convert -->");
  124.   staticStatus->SetWindowText("Status: Idle");
  125.   myPresentState = nIdle;
  126. }
  127.  
  128. void DlgConvertService::GoToWaitingForServiceState()
  129. {
  130.   btnConvert->SetWindowText("Cancel");
  131.   staticStatus->SetWindowText("Status: Waiting for service...");
  132.   myPresentState = nWaitingForService;
  133. }
  134.